
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class Test {
    public static void main(String[] args) {
        // 在数据库中存储日期和时间
        // 除了旧式的java.util.Date，我们还可以找到另一个java.sql.Date，它继承自java.util.Date，但会自动忽略所有时间相关信息。这个奇葩的设计原因要追溯到数据库的日期与时间类型。
        // 在数据库中，也存在几种日期和时间类型：
        // DATETIME：表示日期和时间；
        // DATE：仅表示日期；
        // TIME：仅表示时间；
        // TIMESTAMP：和DATETIME类似，但是数据库会在创建或者更新记录的时候同时修改TIMESTAMP。

        // 数据库 对应Java类（旧） 对应Java类（新）
        // DATETIME java.util.Date LocalDateTime
        // DATE java.sql.Date LocalDate
        // TIME java.sql.Time LocalTime
        // TIMESTAMP java.sql.Timestamp LocalDateTime

        // 存储的最常用的是时刻（Instant），因为有了时刻信息，就可以根据用户自己选择的时区，显示出正确的本地时间
        long ts = 1574208900000L;
        System.out.println(timestampToString(ts, Locale.CHINA, "Asia/Shanghai"));
        System.out.println(timestampToString(ts, Locale.US, "America/New_York"));
    }

    static String timestampToString(long epochMilli, Locale lo, String zoneId) {
        Instant ins = Instant.ofEpochMilli(epochMilli);
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.SHORT);
        return f.withLocale(lo).format(ZonedDateTime.ofInstant(ins, ZoneId.of(zoneId)));
    }

}
